用 cocoapods 创建私有库

写在前面

文章主要部分

写在前面

关于cocoapods的一些小知识

两个重要的仓库

上手集成

如果不需要细究cocoapods的一些工作细节,那么我们可以直接开始上手集成

##关于cocoapods的一些小知识

来到这里的小伙伴,通常都已经有了使用cocoapods的经验,那么废话不多说,我们直接在终端打开目录

$ open ~/.cocoapods/repos

接下来我们可以看到如下目录结构

.                                            
├── Specs                                # 索引库列表
    └── [REPO_NAME]                     # 索引库名(其中master为cocoapods官方索引库)
        └── [SPEC_NAME]                    # 第三方库名
            └── [VERSION]                # 第三方库版本
                  └── [SPEC_NAME].podspec    # 第三方库的版本说明文件

根据以上目录我们不难看出,索引库中存着不同名称的索引库,即spec repo(没有私有库的话,只有一个master),在索引库spec repo目录下才包含各种以第三方库名命名的文件夹如:AFNetworking,在这些文件夹下包含以不同版本号命名的文件夹如3.0.0等,再点开就会看到一个诸如AFNetworking.podspec的文件,那么这个就是有关于AFNetworking这个库在3.0.0版本下的描述文件,关于这个目录我们就先了解到这里,并没有任何难点,是不是挺无聊,那么由浅入深,我们接着往下走。

关于cocoapods的一些基本工作原理

  • 我们把cocoapods 想象成一个工具,当我们运行 pod install 的时候,他帮我们做了两件事情,事实上,cocoapods为我们所有我们看得见看不见的工作,其根本目的就是以下两点:

    1. 帮我们找到我们需要的库
    
    2. 把我们需要的库集成到我们的工程里面
    
  • 对于第一件事情,相信绝大多数的人单从字面意思都可以很容易理解,甚至很多人都会进一步思考cocoapods究竟是怎么帮我们搜的,那么我们一会就来探究一下cocoapods是怎么为开发者做到这第一件事情的吧。

  • 关于cocoapods为我们做的第二件事情,里面包含着许多的细节性工作,鉴于个人能力目前也不在这个范围内,这里也就无法细述,但并不影响我们接下来的所有工作。

##两个重要的仓库

spec repository 描述文件仓库(即索引库)

通常我们指的是cocoapods项目在GitHub上存放各种第三方库的版本描述文件.podspec的仓库(称之为索引库),也就是官方Spec Repo ,当你使用cocoapods时,它就会被clone到你的本地。这个仓库在cocoapods的设计中起到了关键的一环。

当你用cocoapods项工程中导入某个库的的时候,首先要做的事情就是寻找你在.Podfile文件里添加的相关库的在哪里,那么我们是不是应该要想,去哪里找呢?答案呢当然是clone到本地的cocoapods索引库spec repo了。

现在我们就简单来扒一下我们每次在终端执行pod install 究竟做了些什么:

  • $ pod install

  • Podfile中提取pod 'AFNetworking', '~> 1.1.1'

  • 到clone到本地的索引库spec repo中搜索名为AFNetworking的文件夹

  • 在找到的AFNetworking目录下寻找名为1.1.1的文件夹

  • 根据1.1.1文件夹中的AFNetworking.podspec 版本描述文件中的具体信息去相应的代码仓库下载or拷贝AFNetworking 1.1.1版本的相关代码

  • AFNetworking 1.1.1版本的代码集成到我们工程中

code repository (第三方库的代码仓库)

  • code repo 是各种第三方库的实际代码存放仓库,一般托管在GitHubgitlab等代码托管网站或私有服务器上。该仓库中附带也会包含一个当前库的版本描述文件.podspec文件,.podspec文件中包含该库当前版本的详细描述,后面会做详细解释说明。

##上手集成

  1. 安装cocopods

    如果没有安装的同学,网上有很多教程,随便搜就可以找到很多。

  2. GitHub、gitlab等网站/服务器上创建私有的代码仓库 code repo,比如我们创建一个VeryNBKit仓库

    在代码托管网站上创建私有的代码仓库,用来保存你的私有库中的代码。

  3. GitHub、gitlab等网站/服务器上创建私有索引库 spec repo

    在前面的小知识中,我们提到在 ~/.cocoapods/repos 目录下包含有不同名称的索引库,其中mastercocoapods官方的索引库,也就是绝大多数公有库的索引库,如果我们写的私有库代码都非常牛逼,又不想开源,又想使用cocoapods来管理我们的私有代码库,那么我们干脆就把我们的私有索引库命名为VeryNBSpecs

    到此为止,我们的两个重要的仓库就创建完毕了,接下来的工作将需要更加细心了。

  4. 将仓库clone到本地

    $ git clone https://github.com/YourName/VeryNBKit.git
    
  5. 在仓库根目录创建Xcode工程

    创建VeryNBKit 项目工程

  6. 在Xcode中编写相关代码

    编写VeryNBKit 中那些牛逼的代码

  7. 创建 VeryNBKit.podspec 文件 (VeryNBKit为牛逼的库名)

    我们知道,当我们光写完这些牛逼的代码,上传到代码托管服务器上之后,cocoapods并不知道我们这些牛逼的代码在哪里,如果我们在Podflie中写到pod 'VeryNBKit', '~> 1.1.1',然后在终端执行pod install,其实cocoapods并不能认识(找到)我们的牛逼代码,这么牛逼的代码你不认识,那逼没法装下去了呀,这可是不行的!!!

    我们知道,cocoapods必须要通过.podspec文件来定位我们牛逼的代码在哪里,然后才能把代码拷贝过来集成到我们的工程里,那么废话不说,直接将.podspec文件甩到cocoapods脸上看他认识不认识。

    打开终端,直接来到VeryNBKit工程的根目录下,执行如下指令,将会为我们创建VeryNBKit.podspec文件。

    $ pod spec create VeryNBKit 
    

    现在.podspec文件有了,接下来在这个文件中加点信息,告诉cocoapods在哪里找我们的VeryNBKit

  8. 编辑 VeryNBKit.podspec 文件

    Pod::Spec.new do |s|
          s.name         = "VeryNBKit" # 项目名称
          s.version      = "0.0.1"        # 版本号 与 你仓库的 标签号 对应
          s.license      = "MIT"          # 开源证书
          s.summary      = "A delightful TextField of VeryNBKit" # 项目简介
    
          s.homepage     = "https://github.com/YourName/VeryNBKit" # 你的主页
          s.source       = { :git => "https://github.com/YourName/VeryNBKit.git", :tag =>             "#{s.version}" }#你的仓库地址,不能用SSH地址
          s.source_files  = "VeryNBKit/VeryNBKit/*.{h,m}""
          # 你代码的位置,以上路径以.podspec文件所在位置为根目录,一直到实际代码所在位置为止,说明如下
          # VeryNBKit/VeryNBKit/*.{h,m} 
          # VeryNBKit/VeryNBKit/**/*.{h,m}
         # 表示 VeryNBKit/VeryNBKit/ 和 VeryNBKit/VeryNBKit/ 文件夹下所有.h和.m文件,以及其子目录下的.h和.m文件
          s.requires_arc = true # 是否启用ARC
          s.platform     = :ios, "7.0" #平台及支持的最低版本
          s.frameworks   = "UIKit", "Foundation" #支持的框架
          # s.dependency   = "AFNetworking" # 依赖库 (如有)
    
          # User
          s.author             = { "YourName" => "YourName@gmail.com" } # 作者信息
          s.social_media_url   = "https://YourName.github.io" # 个人主页
    
    end
    
  9. 按照如上内容填好之后,我们需要验证podspec文件

    $ pod lib lint
    

    当我们看到如下提示,则说明验证通过了

    -> VeryNBKit (0.0.1)
    - NOTE  | xcodebuild:  note: Using new build system
    - NOTE  | [iOS] xcodebuild:  note: Planning build
    - NOTE  | [iOS] xcodebuild:  note: Constructing build description
    - NOTE  | [iOS] xcodebuild:  warning: Skipping code signing because the target does not have an Info.plist file. (in target 'App')
    
    VeryNBKit passed validation.
    
  10. VeryNBKit.podspec验证通过之后,我们就需要把代码上传到代码库了

    $ git add .
    $ git commit -m "提交信息"
    $ git push origin master
    
    给仓库打标签
    标签相当于将你的仓库的一个压缩包,用于稳定存储当前版本。
    标签号与你在 s.version = "1.0.0"的版本号一致 1.0.0
    
    $ git tag -a XXX -m "发布XXX版本" 
    $ git push origin --tags
    
  11. 发布 VeryNBKit.podspec

    VeryNBKit.podspec发布之前,我们是否还记得我们的私有索引库VeryNBSpecs,没错,如果我们发布到私有库,那么就需要先把我们的VeryNBSpecs添加到我们的spec repo列表中去,在终端中执行如下命令:

    $ pod repo add VeryNBSpecs https://gitlab.com/YourName/VeryNBSpecs.git
    

    完了之后,我们可以打开~/.cocoapods/repos

    $ open ~/.cocoapods/repos
    

    是不是会惊喜的发现,多了一个VeryNBSpecs文件夹,没错,就是我们的牛逼代码索引库。

    最后我们将VeryNBKit.podspec push到VeryNBSpecs索引库

    $ pod repo push VeryNBSpecs VeryNBKit.podspec 
    
  12. pod搜索一下我们的VeryNBKit

    $ pod search VeryNBKit
    

    搜到了吧,恭喜你,成功了!!!